from visual import *
from math import *
import constants


def getDistanceFromAxis(ball, canon):
    T = ball.pos    
    A = canon.pos
    B = canon.axis + A
    TA = T - A
    TB = T - B
    BA = B - A
    d = (mag(TA.cross(TB))) / (mag(BA))
    return d

#prima kuglu i top
#racuna udaljenost po formuli za udaljenost tocke od pravca u prostoru
#vraca udaljenost kugle od pravca topa

def getDistanceFromStart(ball):
    T = ball.pos
    d = math.sqrt(math.pow(T.x - constants.canonStart.x, 2) + math.pow(T.y - constants.canonStart.y, 2) + math.pow(T.z - constants.canonStart.z, 2))
    print(d)
    return d

#racuna udaljenost kugle od početne točke topa

def getAllHits(allBalls, canon):
    hitBalls = []
    for index in range(len(allBalls)):        
        ball = allBalls[index]
        d = getDistanceFromAxis(ball, canon)
        if d <= (constants.defaultRadius + 0.1):
            print ("dodaj u hitBalls index", index, "udaljenost je", d)
            hitBalls.append(index)
    return hitBalls   

#trazi sve kugle koje su na putanji topa u trenutku hica
#na putanji znaci da je udaljenost centra kugle od pravca topa <= defaultRadius + 0.1
#zasto mnozina, kugli? pa zato sto ima vise kugli na putanji,
#ali sudari se samo s onom koja najblisa topu
#funkcija prima listu kugli allBalls i top koji je arrow
#distancu od pravca topa racuna u petlji za svaku kuglu s funkcijom getDistanceFromAxis
#vraca listu indexa kugli koje su na putanji
        
def getOneHit(hitBalls, allBalls, canon):
    minimumIndex = hitBalls[0]
    minimumDistanceBall = allBalls[minimumIndex]
    minimumDistance = getDistanceFromStart(minimumDistanceBall)
    print ("pocetna minimalna udaljenost od canonStart je", minimumDistance, "za index", minimumIndex)
    for i in range(len(hitBalls)):
        index = hitBalls[i]
        if getDistanceFromStart(allBalls[index]) < minimumDistance:
            minimumIndex = index
            minimumDistance = getDistanceFromStart(allBalls[index])
            print ("nova minimalna udaljenost od canonStart je", minimumDistance, "za index", minimumIndex)
    return minimumIndex
        
#prima listu hitBalls s indexima pogodjenih kugli, listu svih kugli allBalls i top
#medju pogodjenim kuglama trazi onu koja najbliza početnoj točki topa pomocu funkcije getDistanceFromStart
#vraca index kugle koja pogodjena
